import matplotlib.pyplot as plt
import pandas as pd
import re
import matplotlib as mpl
from openpyxl import *
from matplotlib.font_manager import FontProperties
from collections import defaultdict

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows 中文支持
plt.rcParams['axes.unicode_minus'] = False    # 正确显示负号

def generate_workflow_report(workflow_df):
    # 生成日志报告 Excel
    r_excel = Workbook()

    # 移除默认创建的第一个工作表（可选）
    default_sheet = r_excel.active
    r_excel.remove(default_sheet)

    # 创建第一个工作表
    sales_sheet = r_excel.create_sheet(title="人脸注册")

    """生成人脸添加流程分析报告"""
    # 流程成功率统计
    # workflow_df['is_success'] = workflow_df['steps'].apply(
    #     lambda x: all(step['status'] == '成功' for step in x.values()))
    
    # success_rate = workflow_df['is_success'].mean() * 100
    
    # # 步骤失败率分析（使用 defaultdict 避免 KeyError）
    # step_failures = defaultdict(int)
    # for flow in workflow_df['steps']:
    #     for step_name, info in flow.items():
    #         if info.get('status') == False:
    #             step_key = f'step_{step_name}'
    #             step_failures[step_key] += 1
    
    # 可视化
    # plt.figure(figsize=(15, 10))
    
    # 成功率饼图
    # plt.subplot(2, 2, 1)
    # plt.pie([success_rate, 100-success_rate],
    #         labels=['成功', '失败'],
    #         autopct='%1.1f%%')
    # plt.title('整体添加成功率')
    
    # 失败原因分布
    # plt.subplot(2, 2, 2)
    # failure_reasons.plot.bar()
    # plt.title('失败原因分布')
    # plt.ylabel('失败次数')
    # plt.xticks(rotation=45)
    
    # # 步骤失败分布
    # plt.subplot(2, 2, 3)
    # # 按步骤顺序排序
    # step_order = [f'step_{i}' for i in [1, 2, 3, 4, 5, 255]]
    # sorted_failures = pd.Series(step_failures).reindex(step_order, fill_value=0)
    # sorted_failures.plot.bar()
    # plt.title('各步骤失败次数')
    # plt.ylabel('失败次数')
    
    # 时间分布
    # plt.subplot(2, 2, 4)
    # # workflow_df['duration'] = (workflow_df['end_time'] - workflow_df['start_time']).dt.total_seconds()
    # # workflow_df['duration'].plot.hist(bins=20)
    # plt.title('添加流程耗时分布')
    # plt.xlabel('耗时(秒)')
    
    # plt.tight_layout()
    # plt.savefig('face_add_report.png')
    
    # 生成详细数据表
    detailed_df = pd.json_normalize(workflow_df.to_dict('records'))
    print(detailed_df)

    # 定义列名映射关系（英文列名 -> 中文别名）
    column_mapping = {
        'ret_code': '返回码',
        'timestamp': '时间'
        # 添加其他需要重命名的列
    }
    
    # 处理步骤相关的列名（动态生成的）
    step_columns = [col for col in detailed_df.columns if col.startswith('step')]

    for col in step_columns:
        # 提取步骤编号和字段名（如 'steps.1.status'）
        parts = col.split('.')

        if len(parts) == 3:
            step_num = parts[1]
            field = parts[2]
            
            # 为不同字段设置中文别名
            if field == 'status':
                column_mapping[col] = f'状态'
            elif field == 'error_desc':
                column_mapping[col] = f'备注'
            elif field == 'ret_code':
                column_mapping[col] = f'返回码'
            elif field == 'timestamp':
                column_mapping[col] = f'{step_num}'
            else:
                column_mapping[col] = f'{field}'
    
    # 重命名列
    detailed_df = detailed_df.rename(columns=column_mapping)

    # 删除所有列名包含"状态"的列（因为status被映射为"状态"）
    detailed_df = detailed_df.drop(columns=[col for col in detailed_df.columns if '状态' in col])
    
    # 使用 openpyxl 引擎保存 Excel
    detailed_df.to_excel('face_add_details.xlsx', index=False, engine='openpyxl')
    
    return detailed_df
